<?php
/**
 * 易优CMS
 * ============================================================================
 * 版权所有 2016-2028 海南赞赞网络科技有限公司，并保留所有权利。
 * 网站地址: http://www.eyoucms.com
 * ----------------------------------------------------------------------------
 * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
 * ============================================================================
 * Author: 陈风任 <491085389@qq.com>
 * Date: 2022-03-23
 */

namespace app\plugins\logic;

use think\Db;
use think\Config;
use think\Request;

/**
 * 逻辑定义
 * Class CatsLogic
 * @package plugins\Logic
 */
load_trait('controller/Jump');
class MultiMerchantLogic
{
    use \traits\controller\Jump;

    /**
     * 构造函数
     */
    public function __construct($users = []) {
        // 会员信息
        $this->users = !empty($users) ? $users : [];

        // 商家主表
        $this->multiMerchantDb = Db::name('WeappMultiMerchant');

        // 商家模型层
        $this->multiMerchantModel = model('MultiMerchant');
    }

    // 商家申请注册
    public function multiMerchantSubmitApply($post = [])
    {
        // 请完善商家名称
        if (empty($post['merchant_name'])) $this->error('请完善商家名称');
        // 请正确完善商家手机
        if (!is_numeric($post['merchant_phone']) || 11 != strlen($post['merchant_phone'])) $this->error('请正确完善商家手机');
        // 请正确设置商家独立密码，6位纯数字
        if (!is_numeric($post['merchant_pass']) || 6 != strlen($post['merchant_pass'])) $this->error('请正确设置商家独立密码，6位纯数字');

        // 商家是否已提交过注册，若已提交则返回链接跳转到登录页
        $Merchant = $this->multiMerchantModel->getFindMerchant($this->users['users_id'], 'users_id');
        if (!empty($Merchant)) $this->error('会员已注册过商家，前往登录', url('plugins/MultiMerchant/login'));

        // 添加商家信息
        $insertData = $this->multiMerchantModel->addFindMerchant($post, $this->users['users_id']);
        if (!empty($insertData)) {
            $this->md5MultiMerchantPass($insertData, true);
            // 返回成功
            $this->success('注册成功，正在登录...', url('plugins/MultiMerchant/cert'));
        } else {
            $this->error('提交注册失败，刷新重试');
        }
    }

    // 商家登录
    public function multiMerchantSubmitLogin($post = [])
    {
        // 更新会员商家登录时间
        $update = [
            'login_time' => getTime()
        ];
        $where = [
            'is_del' => 0,
            'users_id' => $this->users['users_id'],
        ];
        $updateID = $this->multiMerchantDb->where($where)->update($update);
        if (!empty($updateID)) {
            // 查询商家信息
            $where['merchant_pass'] = md5(intval($post['merchant_pass']));
            $Merchant = $this->multiMerchantDb->field('users_id, login_time, merchant_pass')->where($where)->find();
            if (!empty($Merchant)) {
                // 密码加密处理
                $this->md5MultiMerchantPass($Merchant, true);
                // 跳转到商家首页
                $this->success('正在登录...', url('plugins/MultiMerchant/index'));
            }
        }
        $this->error('商家不存在，请先注册');
    }

    // 商家信息更新
    public function multiMerchantSubmitUpdate($post = [])
    {
        // 请完善商家名称
        if (empty($post['merchant_name'])) $this->error('请完善商家名称');
        // 请完善主营行业
        if (empty($post['merchant_industry'])) $this->error('请完善主营行业');
        // 请正确完善商家手机
        if (!is_numeric($post['merchant_phone']) || 11 != strlen($post['merchant_phone'])) $this->error('请正确完善商家手机');
        if (!empty($post['merchant_pass'])) {
            // 请正确设置商家独立密码，6位纯数字
            if (!is_numeric($post['merchant_pass']) || 6 != strlen($post['merchant_pass'])) $this->error('请正确设置商家独立密码，6位纯数字');
        }

        // 保存商家信息
        $updateData = $this->multiMerchantModel->updateFindMerchant($post, $this->users['users_id']);
        if (!empty($updateData)) {
            if (is_array($updateData)) $this->md5MultiMerchantPass($updateData, true);
            // 返回成功
            $this->success('更新成功...');
        } else {
            $this->error('更新失败，刷新重试');
        }
    }

    // 商家联系地址
    public function multiMerchantSubmitContact($post = [], $merchant_id = 0)
    {
        // 请完善联系人姓名
        if (empty($post['contact']['contactName'])) $this->error('请完善联系人姓名');
        // 请完善联系人手机
        if (!is_numeric($post['contact']['contactPhone']) || 11 != strlen($post['contact']['contactPhone'])) $this->error('请完善联系人手机');
        // 请完善商家联系地址
        if (empty($post['contact']['contactProvince']) || empty($post['contact']['contactCity']) || empty($post['contact']['contactDistrict'])) $this->error('请完善商家联系地址');
        // 请完善商家联系地址
        if (empty($post['contact']['contactAddress'])) $this->error('请完善商家联系地址');

        // // 请完善联系人姓名
        // if (empty($post['service']['serviceReceiver'])) $this->error('请完善联系人姓名');
        // // 请完善联系人手机
        // if (!is_numeric($post['service']['serviceCellPhone']) || 11 != strlen($post['service']['serviceCellPhone'])) $this->error('请完善联系人手机');
        // // 请完善商家联系地址
        // if (empty($post['service']['serviceProvince']) || empty($post['service']['serviceCity']) || empty($post['service']['serviceDistrict'])) $this->error('请完善商家联系地址');
        // // 请完善商家联系地址
        // if (empty($post['service']['serviceAddress'])) $this->error('请完善商家联系地址');

        // 更新商家联系地址
        $resultID = $this->multiMerchantModel->updateMerchantContact($post, $merchant_id);
        if (!empty($resultID)) {
            $this->success('地址更新成功');
        } else {
            $this->error('地址更新失败，刷新重试');
        }
    }

    // 商家申请认证信息
    public function multiMerchantSubmitApplyCert($post = [], $merchant_id = 0, $edit = false)
    {
        // 检查提交的POST数据中必填参数是否已填写
        $this->checkPostRequiredRaram($post);

        // 提交商家认证申请，更新商家信息
        $updateID = $this->multiMerchantModel->certFindMerchant($post, $merchant_id, $edit);
        if (!empty($updateID)) {
            // 返回成功
            $this->success('提交申请成功，等待审核');
        } else {
            $this->error('提交申请失败，刷新重试');
        }
    }

    // 检查提交的POST数据中必填参数是否已填写
    private function checkPostRequiredRaram($post = [])
    {
        if (empty($post['apply_type'])) $this->error('请选择认证类型');
        // 申请个人商家认证信息
        if (1 === intval($post['apply_type'])) {
            // 请填写商家信息-个人商家-真实姓名
            empty($post['personal']['personalName']) && $this->error('请填写商家信息-个人商家-真实姓名', null, true);
            // 请填写商家信息-个人商家-真实手机
            empty($post['personal']['personalPhone']) && $this->error('请填写商家信息-个人商家-真实手机', null, true);
            // 请填写商家信息-个人商家-真实身份证号
            empty($post['personal']['personalIDCard']) && $this->error('请填写商家信息-个人商家-真实身份证号', null, true);
        }
        // 申请公司商家认证信息
        else if (2 === intval($post['apply_type'])) {
            // 请填写商家信息-企业商家-公司名称
            empty($post['company']['companyName']) && $this->error('请填写商家信息-企业商家-公司名称', null, true);
            // 请填写商家信息-企业商家-公司地址
            if (empty($post['company']['companyProvince']) || empty($post['company']['companyCity']) || empty($post['company']['companyDistrict'])) $this->error('请填写商家信息-企业商家-公司地址', null, true);
            // 请填写商家信息-企业商家-详细地址
            empty($post['company']['companyAddress']) && $this->error('请填写商家信息-企业商家-详细地址', null, true);

            // 请填写商家信息-企业商家-银行开户名
            empty($post['company']['openBankAccountName']) && $this->error('请填写商家信息-企业商家-银行开户名', null, true);
            // 请填写商家信息-企业商家-公司银行账号
            empty($post['company']['openBankCompanyAccount']) && $this->error('请填写商家信息-企业商家-公司银行账号', null, true);
            // 请填写商家信息-企业商家-开户银行名称
            empty($post['company']['openBankName']) && $this->error('请填写商家信息-企业商家-开户银行名称', null, true);
            // 请填写商家信息-企业商家-开户银行所在地
            if (empty($post['company']['openBankProvince']) || empty($post['company']['openBankCity']) || empty($post['company']['openBankDistrict'])) $this->error('请填写商家信息-企业商家-开户银行所在地', null, true);

            // 请填写商家信息-企业商家-真实姓名
            empty($post['company']['legalPersonName']) && $this->error('请填写商家信息-企业商家-真实姓名', null, true);
            // 请填写商家信息-企业商家-真实手机
            if (empty($post['company']['legalPersonPhone']) || 11 !== intval(strlen($post['company']['legalPersonPhone']))) $this->error('请填写商家信息-企业商家-真实手机', null, true);
            // 请填写商家信息-企业商家-真实身份证号
            if (empty($post['company']['legalPersonalIDCard']) || 15 > intval(strlen($post['company']['legalPersonalIDCard'])) || 18 < intval(strlen($post['company']['legalPersonalIDCard']))) $this->error('请填写商家信息-企业商家-真实身份证号', null, true);
        }

        if (empty($post['settle_type'])) $this->error('请选择结算方式');
        // 银行卡结算方式
        if (1 === intval($post['settle_type'])) {
            // 请填写结算账户-结算银行开户名
            empty($post['settle']['bankAccountName']) && $this->error('', null, true);
            // 请填写结算账户-结算公司银行账号
            empty($post['settle']['bankCompanyAccount']) && $this->error('', null, true);
            // 请填写结算账户-结算开户银行支行名称
            empty($post['settle']['bankName']) && $this->error('', null, true);
            // 请填写结算账户-结算开户银行所在地
            if (empty($post['settle']['bankProvince']) || empty($post['settle']['bankCity']) || empty($post['settle']['bankDistrict'])) $this->error('', null, true);
        }
        // 支付宝结算方式
        else if (2 === intval($post['settle_type'])) {
            // 请填写结算账户-用户真实姓名
            empty($post['settle']['alipayActualName']) && $this->error('', null, true);
            // 请填写结算账户-支付宝账号
            empty($post['settle']['alipayAccount']) && $this->error('', null, true);
        }
        // 微信结算方式
        else if (3 === intval($post['settle_type'])) {
            // 请填写结算账户-用户真实姓名
            empty($post['settle']['wechatActualName']) && $this->error('', null, true);
            // 请填写结算账户-微信账号
            empty($post['settle']['wechatAccount']) && $this->error('', null, true);
        }
    }

    // 获取加密后的商家密码
    public function md5MultiMerchantPass($data = [], $is_session = false)
    {
        // 注册成功，默认进行登录
        $merchantPass = [
            'users_id' => intval($data['users_id']),
            'login_time' => intval($data['login_time']),
            'merchant_pass' => strval($data['merchant_pass']),
        ];
        $merchantPass = md5(md5(serialize($merchantPass)));
        if (!empty($is_session)) {
            session('merchantPass', $merchantPass);
        } else {
            return $merchantPass;
        }
    }


    // -------- 商品部分
    
    // 多商家商品变动后删除商品缓存
    private function productCacheDel()
    {
        foreach ([HTML_ROOT, CACHE_PATH] as $k2 => $v2) {
            delFile($v2);
        }
    }

    // 商家商品添加
    public function addMerchantProduct($merchant_id = 0, $post = [])
    {
        // 必填参数判断
        empty($post['title']) && $this->error('请填写商品名称');
        empty($post['typeid']) && $this->error('请选择所属栏目');
        empty($post['users_price']) && $this->error('请填写商品价格');
        empty($post['stock_count']) && $this->error('请填写商品库存');
        if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [2]) && empty($post['netdisk_url'])) $this->error('请填写网盘地址');
        if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [3]) && empty($post['text_content'])) $this->error('请填写文本内容');

        // 商品内容详情
        $productContent = input('post.product_content', '', null);
        // 如果没有上传商品缩略图则从内容中提取第一张图片作为商品缩略图
        if (empty($post['litpic'])) $post['litpic'] = get_html_first_imgurl($productContent);
        // SEO描述处理
        $post['seo_description'] = '';
        if (!empty($productContent)) $post['seo_description'] = @msubstr(checkStrHtml($productContent), 0, config('global.arc_seo_description_length'), false);

        // 商家商品添加
        $insertID = $this->multiMerchantModel->addMerchantProduct($merchant_id, $post, $this->users);
        // 商品添加成功后续
        if (!empty($insertID)) {
            // 添加查询执行语句到mysql缓存表
            model('SqlCacheTable')->InsertSqlCacheTable();

            // 添加商品图片
            $this->multiMerchantModel->addMerchantProductImg($insertID, $post['product_img'], $post['title']);

            // 添加商品详情内容
            $this->multiMerchantModel->addMerchantProductContent($insertID, $productContent);

            // 添加TAG标签
            // model('Taglist')->savetags($insertID, $post['typeid'], $post['tags'], -1, 'add');

            // 若选择多规格选项，则添加产品规格
            if (!empty($post['product_spec']) && 2 == $post['product_spec']) $this->multiMerchantModel->bulkaddMerchantProductSpec($merchant_id, $insertID, $post);
            // 删除规格库中自定义的规格
            $where = ['product_add' => 1, 'merchant_id' => $merchant_id];
            Db::name('product_spec_preset')->where($where)->delete();

            // 添加虚拟商品信息
            if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [2, 3])) $this->multiMerchantModel->addMerchantProductNetdisk($insertID, $post);
            
            // 添加商品参数
            $this->multiMerchantModel->addMerchantProductCustomParam($insertID, $post['param_name'], $post['param_value']);

            // 多商家商品变动后删除商品缓存
            $this->productCacheDel();

            // 成功返回
            $this->success('添加成功，等待审核..', url('plugins/MultiMerchant/product'));
        } else {
            $this->error('添加失败，刷新重试..');
        }
    }

    // 删除商家商品(真实删除)
    public function delMerchantProduct($merchant_id, $aid = [])
    {
        // 商品ID
        $aid = !empty($aid) ? eyIntval($aid) : [];
        // 执行商品删除
        $where = [
            'aid' => ['IN', $aid],
            'merchant_id' => $merchant_id
        ];
        $deleteID = Db::name('archives')->where($where)->delete();
        if (!empty($deleteID)) {
            // 去除多商家条件
            unset($where['merchant_id']);
            // 同步删除商品附加图集
            Db::name('product_img')->where($where)->delete();
            // 同步删除商品附加内容
            Db::name('product_content')->where($where)->delete();
            // 同步删除商品虚拟信息
            Db::name('product_netdisk')->where($where)->delete();
            // 同步删除商品规格信息
            Db::name('product_spec_data')->where($where)->delete();
            Db::name('product_spec_data_handle')->where($where)->delete();
            // 同步删除商品规格价格
            Db::name('product_spec_value')->where($where)->delete();
            // 同步删除商品自定义参数
            Db::name('product_custom_param')->where($where)->delete();
            // 多商家商品变动后删除商品缓存
            $this->productCacheDel();
            // 成功返回
            $this->success('删除成功..');
        } else {
            $this->error('删除失败，刷新重试..');
        }
    }

    // 执行更新商品上架/下架
    public function updateMerchantProduct($merchant_id, $post = [])
    {
        if (!empty($post['aid']) && in_array($post['status'], [0, 1])) {
            $where = [
                'aid' => $post['aid'],
                'merchant_id' => $merchant_id
            ];
            $update = [
                'status' => $post['status'],
                'update_time' => getTime()
            ];
            $updateID = Db::name('archives')->where($where)->update($update);
            if (!empty($updateID)) {
                // 多商家商品变动后删除商品缓存
                $this->productCacheDel();
                // 成功返回
                $this->success('操作成功..');
            } else {
                $this->error('操作失败，刷新重试..');
            }
        }
        $this->error('操作失败，刷新重试..');
    }

    // 获取预设规格标记ID数组
    public function getUsePresetMarkID($post = [])
    {
        // 当选的规格名称标记ID
        $result = !empty($post['presetMarkID']) ? $post['presetMarkID'] : 0;
        if (empty($result)) return false;

        // 组合已选规格名字标记ID，若超过三个则返回 false
        if (!empty($post['usePresetMarkID'])) {
            $usePresetMarkID = $post['usePresetMarkID'] . ',' . $result;
            if (3 < count(explode(',', $usePresetMarkID))) {
                $result = false;
            } else {
                $result = $usePresetMarkID;
            }
        }

        // 返回结束
        return $result;
    }

    // 剔除已选择的规格名称查询未选择的规格名称组装成下拉返回
    public function getPresetNameOption($merchant_id = 0, $usePresetMarkID = '')
    {
        // 查询预设规格信息
        $specPreset = $this->multiMerchantModel->getProductSpecPreset($merchant_id, $usePresetMarkID, 'NOT IN');

        // 拼装下拉选项
        $Option = '<option value="0">选择规格名称</option>';
        if (!empty($specPreset)) {
            foreach ($specPreset as $value) {
                $Option .= "<option value='{$value['preset_mark_id']}'>{$value['preset_name']}</option>";
            }
        }

        // 返回结束
        return [
            'option' => $Option,
            'markID' => $usePresetMarkID,
        ];
    }

    // 拼装预设规格名称的规格值下拉选项
    public function getPresetValueOption($merchant_id = 0, $presetMarkID = 0, $option1 = 'IN', $presetID = [], $option2 = '')
    {
        // 查询当选规格的全部规格值
        $specPreset = $this->multiMerchantModel->getProductSpecPresetValue($merchant_id, $presetMarkID, $option1, $presetID, $option2);
        $Name = $specPreset[0]['preset_name'];

        // 拼装下拉选项
        $Option = '<option value="0">选择规格值</option>';
        if (!empty($specPreset)) {
            foreach ($specPreset as $value) {
                $Option .= "<option value='{$value['preset_id']}'>{$value['preset_value']}</option>";
            }
        }

        // 返回结束
        return [
            'name' => $Name,
            'option' => $Option,
        ];
    }

    // 整合Session和Post中的规格数据(添加页)
    public function getMergeSessionAndPostArray($merchant_id = 0, $post = [])
    {
        // Post 数据
        $presetID = !empty($post['presetID']) ? $post['presetID'] : 0;
        $presetMarkID = !empty($post['presetMarkID']) ? $post['presetMarkID'] : 0;

        // Session 数据
        $merchantSpecArray = session($merchant_id . '_MerchantSpecArray');

        // 整合Session和Post中的规格数据
        if (!empty($presetID) && !empty($presetMarkID)) {
            $mergeSpecArrayNew = [ $presetMarkID => [ $presetID ] ];
            foreach ($mergeSpecArrayNew as $key => $value) {
                if (isset($merchantSpecArray[$key])) {
                    if (in_array($value[0], $merchantSpecArray[$key])) {
                        return ['error' => '已有相同规格值，无需重复添加'];
                    } else {
                        // session存在数据，但选中参数在数据中还没有，合并数据
                        $merchantSpecArray[$key] = array_merge($merchantSpecArray[$key], $value);
                    }
                } else {
                    if (!empty($merchantSpecArray)) {
                        $merchantSpecArray = $merchantSpecArray + $mergeSpecArrayNew;
                    } else {
                        $merchantSpecArray = $mergeSpecArrayNew;
                    }
                }
            }
        }

        // Session 存入
        session($merchant_id . '_MerchantSpecArray', $merchantSpecArray);

        // 返回结束
        return $merchantSpecArray;
    }

    // 已选规格进行HTML代码拼装
    public function getProductSpecAssembly($post = [])
    {
        if (empty($post)) return ' ';

        // 参数处理
        foreach ($post as $k => $v) {
            $specArrSort[$k] = count($v);
        }
        asort($specArrSort);        
        foreach ($specArrSort as $key =>$val) {
            $specNewArr[$key] = $post[$key];
        }
        $specKeys  = array_keys($specNewArr);
        $specNewArr = $this->dataCombination($specNewArr);
        $specNameArr = Db::name('product_spec_preset')->group('preset_mark_id')->getField('preset_mark_id, preset_name');
        $specValueArr = Db::name('product_spec_preset')->getField('preset_id, preset_value, preset_mark_id');
        $ReturnHtml = "<table class='table table-bordered' id='spec_input_tab' border='1' cellpadding='10' cellspacing='10'><thead><tr>";
        // 显示第一行的数据
        foreach ($specKeys as $k => $v) {
            $ReturnHtml .= "<td><b><input type='hidden' class='prese_name_input_{$v}' name='preset_mark_id[$v][preset_name]' value='{$specNameArr[$v]}'><span class='preset_name_span_{$v}'>{$specNameArr[$v]}</span></b></td>";
        }
        $ReturnHtml .= "<td><b>价格 <a href=\"javascript:void(0);\" onclick=\"bulkSetPrice(this);\" style=\"color: #0ba6f3;\">批量设置 </a></b></td>";
        $ReturnHtml .= "<td><b>库存 <a href=\"javascript:void(0);\" onclick=\"bulkSetStock(this);\" style=\"color: #0ba6f3;\">批量设置 </a></b></td>";
        $ReturnHtml .= "<td><b>销量</b></td>";
        $ReturnHtml .= "</tr></thead><tbody>";

       // 显示第二行开始
       foreach ($specNewArr as $k => $v) {
            $ReturnHtml .= "<tr id='preset_value_tr_{$v[0]}'>";
            $preset_key_name = array();
            foreach($v as $k2 => $v2) {
                $ReturnHtml .= "<td style='text-align: center; vertical-align: middle;'><input type='hidden' class='preset_value_input_{$v2}' name='preset_id[$v2][preset_value]' value='{$specValueArr[$v2]['preset_value']}'><span class='preset_value_span_{$v2}'>{$specValueArr[$v2]['preset_value']}</span></td>";                
                $preset_key_name[$v2] = $specNameArr[$specValueArr[$v2]['preset_mark_id']].':'.$specValueArr[$v2]['preset_value'];
            }
            ksort($preset_key_name);
            $preset_key = implode('_', array_keys($preset_key_name));

            $ReturnHtml .="<td style='text-align: center; vertical-align: middle;'><input class='users_price' name='preset_price[$preset_key][users_price]' value='0' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\"); upPrice(this);' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\");'/></td>";

            $ReturnHtml .="<td style='text-align: center; vertical-align: middle;'><input class='stock_count' name='preset_stock[$preset_key][stock_count]' value='0' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\"); upStock(this);' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\");' data-old_stock='0'/></td>";

            $ReturnHtml .="<td style='text-align: center; vertical-align: middle;'><input type='text' name='preset_sales[$preset_key][spec_sales_num]' value='0' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\");' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\");'></td>";

            $ReturnHtml .="</tr>";
        }
        $ReturnHtml .= "</tbody>";
        $ReturnHtml .= "</table>";

        // 返回结束
        return $ReturnHtml;
    }

    // 剔除已选择的规格值查询未选择的规格值组装成下拉返回
    public function getNotInPresetValueOption($merchant_id = 0, $post = [])
    {
        // Session 数据
        $merchantSpecArray = session($merchant_id . '_MerchantSpecArray');

        // 获取指定规格名称下的规格值数组
        $presetIDArray = !empty($merchantSpecArray[$post['presetMarkID']]) ? $merchantSpecArray[$post['presetMarkID']] : [];

        // 剔除已选择的规格值查询未选择的规格值数据
        $specResult = $this->multiMerchantModel->getNotInProductSpecPresetValue($merchant_id, $presetIDArray, $post);

        // 拼装下拉选项
        $option = "<option value='0'>选择规格值</option>";
        if (!empty($specResult['option'])) {
            foreach($specResult['option'] as $value) {
                $option .= "<option value='{$value['preset_id']}'>{$value['preset_value']}</option>";
            }
        }

        // 返回结束
        return [
            'option' => $option,
            'value' => $specResult['value'],
        ];
    }

    // 添加自定义规格到规格预设表
    public function addProductSpecSaveUse($merchant_id = 0, $post = [])
    {
        // 最大ID值
        $presetMarkID = $this->multiMerchantModel->getMaxPresetMarkID();
        // 添加的数据
        $insert = [];
        // 添加的规格名称处理
        if (empty($post['set_preset_name'])) $this->error('请填写规格名称...');
        // 添加的规格值处理
        $setPresetValue = $post['set_preset_value'];
        foreach ($setPresetValue as $key => $value) {
            if (!empty($value)) {
                $insert[] = [
                    'preset_mark_id' => $presetMarkID,
                    'preset_name' => $post['set_preset_name'],
                    'preset_value' => $value,
                    'spec_sync' => 0,
                    'sort_order' => 100,
                    'merchant_id' => $merchant_id,
                    'product_add' => 1,
                    'add_time' => getTime(),
                    'update_time' => getTime(),
                ];
            }
        }
        if (empty($insert)) $this->error('请填写规格值...');
        // 执行添加
        $resultID = Db::name('product_spec_preset')->insertAll($insert);
        // 添加后续操作
        if (!empty($resultID)) {
            // Session 数据
            $merchantSpecArray = session($merchant_id . '_MerchantSpecArray');

            // 如果已添加过则执行
            if (!empty($post['is_add_spec']) && !empty($post['preset_mark_id'])) {
                // 删除指定规格
                $where = [
                    'merchant_id' => $merchant_id,
                    'preset_mark_id' => $post['preset_mark_id']
                ];
                $isDelete = Db::name('product_spec_preset')->where($where)->delete();
                if (!empty($isDelete)) unset($merchantSpecArray[$post['preset_mark_id']]);
            }

            // 查询添加的规格信息
            $where = [
                'preset_mark_id' => $presetMarkID,
                'merchant_id' => $merchant_id,
                'product_add' => 1
            ];
            $field = 'preset_mark_id, preset_id';
            $ProductSpecPreset = Db::name('product_spec_preset')->field($field)->where($where)->select();
            $ProductSpecPresetNew[$presetMarkID] = get_arr_column($ProductSpecPreset, 'preset_id');

            // 判断是否已存在 Session ，如果存在则合并，不存在则覆盖
            if (!empty($merchantSpecArray)) {
                $merchantSpecArray = $merchantSpecArray + $ProductSpecPresetNew;
            } else {
                $merchantSpecArray = $ProductSpecPresetNew;
            }

            // Session 存入
            session($merchant_id . '_MerchantSpecArray', $merchantSpecArray);

            // 返回规格标记ID串
            $usePresetMarkID = [];
            foreach ($merchantSpecArray as $key => $value) {
                array_push($usePresetMarkID, $key);
            }
            $usePresetMarkID = implode(',', $usePresetMarkID);

            // 返回结束
            return [
                'presetMarkID' => $presetMarkID,
                'SpecArray' => $merchantSpecArray,
                'usePresetMarkID' => $usePresetMarkID
            ];
        }
    }

    // 清除指定的规格信息(商品添加session)
    public function productSpecPresetClear($merchant_id = 0, $post = [])
    {
        // 获取已经选择的规格信息
        $merchantSpecArray = session($merchant_id . '_MerchantSpecArray');
        // 当选规格名称ID
        $presetMarkID = !empty($post['presetMarkID']) ? $post['presetMarkID'] : 0;
        // 清除整条规格信息
        if ('name' === strval($post['clear'])) {
            if (!empty($presetMarkID) && !empty($post['usePresetMarkID'])) {
                // 清除指定规格数据
                unset($merchantSpecArray[$presetMarkID]);
                // 更新后的 Session 存入
                session($merchant_id . '_MerchantSpecArray', $merchantSpecArray);

                // 获取全部可选的规格名称
                $usePresetMarkID = explode(',', $post['usePresetMarkID']);
                foreach ($usePresetMarkID as $key => $value) {
                    if (intval($value) === intval($presetMarkID)) unset($usePresetMarkID[$key]);
                }
                $usePresetMarkID = implode(',', $usePresetMarkID);
                // 剔除已选择的规格名称查询未选择的规格名称组装成下拉返回
                $nameOption = $this->getPresetNameOption($merchant_id, $usePresetMarkID);

                // 追加规格数据并返回
                $nameOption['SpecArray'] = $merchantSpecArray;
                $nameOption['nameOption'] = $nameOption['option'];
                return $nameOption;
            }
        }
        // 清除单个规格信息
        else if ('value' === strval($post['clear'])) {
            // 规格值ID
            $presetID = !empty($post['presetID']) ? $post['presetID'] : 0;
            if (!empty($presetMarkID) && !empty($presetID)) {
                // 删除指定的规格值ID
                foreach ($merchantSpecArray[$presetMarkID] as $key => $value) {
                    if (intval($value) === intval($presetID)) {
                        unset($merchantSpecArray[$presetMarkID][$key]);
                    }
                }
                // 若规格组下没有规格值则删除规格组
                if (empty($merchantSpecArray[$presetMarkID])) unset($merchantSpecArray[$presetMarkID]);
                // 更新后的 Session 存入
                session($merchant_id . '_MerchantSpecArray', $merchantSpecArray);
                // 剔除已选择的规格值查询未选择的规格值组装成下拉返回
                $notInPresetID = !empty($merchantSpecArray[$presetMarkID]) ? $merchantSpecArray[$presetMarkID] : [];
                $valueOption = $this->getPresetValueOption($merchant_id, $presetMarkID, 'IN', $notInPresetID, 'NOT IN');

                // 追加规格数据并返回
                return [
                    'SpecArray' => $merchantSpecArray,
                    'valueOption' => $valueOption['option']
                ];
            }
        }
    }

    // 商家商品编辑
    public function editMerchantProduct($merchant_id = 0, $post = [])
    {
        // 必填参数判断
        empty($post['aid']) && $this->error('请选择编辑商品');
        empty($post['title']) && $this->error('请填写商品名称');
        empty($post['typeid']) && $this->error('请选择所属栏目');
        empty($post['users_price']) && $this->error('请填写商品价格');
        empty($post['stock_count']) && $this->error('请填写商品库存');
        if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [2]) && empty($post['netdisk_url'])) $this->error('请填写网盘地址');
        if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [3]) && empty($post['text_content'])) $this->error('请填写文本内容');

        // 商品内容详情
        $productContent = input('post.product_content', '', null);
        // 如果没有上传商品缩略图则从内容中提取第一张图片作为商品缩略图
        if (empty($post['litpic'])) $post['litpic'] = get_html_first_imgurl($productContent);
        // SEO描述处理
        $post['seo_description'] = '';
        if (!empty($productContent)) $post['seo_description'] = @msubstr(checkStrHtml($productContent), 0, config('global.arc_seo_description_length'), false);

        // 商家商品编辑
        $editID = $this->multiMerchantModel->editMerchantProduct($merchant_id, $post);
        // 商品编辑成功后续
        if (!empty($editID)) {
            // 添加商品图片
            $this->multiMerchantModel->addMerchantProductImg($editID, $post['product_img'], $post['title']);

            // 添加商品详情内容
            $this->multiMerchantModel->editMerchantProductContent($editID, $productContent);

            // 添加TAG标签
            // model('Taglist')->savetags($editID, $post['typeid'], $post['tags'], -1, 'edit');

            // 若选择多规格选项，则编辑商品规格
            if (!empty($post['product_spec']) && 1 == $post['product_spec']) {
                // 清除商品规格表的规格信息
                $this->multiMerchantModel->clearProductSpecData($editID);
                // 清除商品规格价格表的规格信息
                $this->multiMerchantModel->clearProductSpecValue($editID);
            } else if (!empty($post['product_spec']) && 2 == $post['product_spec']) {
                $this->multiMerchantModel->bulkeditMerchantProductSpec($merchant_id, $editID, $post);
            }

            // 编辑虚拟商品信息
            if (!empty($post['prom_type']) && in_array($post['prom_type_vir'], [2, 3])) $this->multiMerchantModel->editMerchantProductNetdisk($editID, $post);

            // 删除原先的商品参参数后重新添加新的
            $this->multiMerchantModel->addMerchantProductCustomParam($editID, $post['param_name'], $post['param_value']);

            // 多商家商品变动后删除商品缓存
            $this->productCacheDel();

            // 成功返回
            $this->success('编辑成功，等待审核..', url('plugins/MultiMerchant/product'));
        } else {
            $this->error('编辑失败，刷新重试..');
        }
    }

    // 获取商家商品详情并处理
    public function getMerchantProductDetails($merchant_id = 0, $aid = 0)
    {
        // 获取商家商品详情
        $productDetails = $this->multiMerchantModel->getMerchantProductDetails($merchant_id, $aid);
        if (empty($productDetails)) return false;

        // 统一基础查询条件
        $where = [
            'aid' => $aid
        ];

        // 查询商品TAGS信息
        $productTags = Db::name('taglist')->where($where)->column('tag');
        $productDetails['tags'] = !empty($productTags) ? implode(',', $productTags) : '';

        // 查询商品轮播图
        $productImg = Db::name('product_img')->where($where)->column('image_url');
        $productDetails['product_img'] = [];
        foreach ($productImg as $key => $value) {
            if (!empty($value)) array_push($productDetails['product_img'], handle_subdir_pic(get_default_pic($value)));
        }

        // 查询商品规格信息
        $shopConfig = getUsersConfigData('shop');
        $maxSpecMarkID = $useSpecNum = 0;
        $useSpecMarkID = $productEditAssembly = '';
        $specPreset = $specSelectHtml = $productSpecData = [];
        if (!empty($shopConfig['shop_open']) && !empty($shopConfig['shop_open_spec'])) {
            // 清除商品规格处理表的规格信息
            $this->multiMerchantModel->clearProductSpecDataHandle($aid);
            // session($merchant_id . '_MerchantSpecArrayEdit', null);
            
            // 查询规格信息
            $productSpecData = Db::name('product_spec_data')->where($where)->order('spec_value_id asc, spec_id asc')->select();
            // 处理规格信息
            if (!empty($productSpecData)) {
                // 添加商品规格处理表的规格信息
                $resultID = $this->multiMerchantModel->addProductSpecDataHandle($productSpecData);
                if (empty($resultID)) $this->error('信息错误，请重新进入');

                $productSpecData = group_same_key($productSpecData, 'spec_mark_id');
                $merchantSpecArrayEdit = [];
                foreach ($productSpecData as $key => $value) {
                    $useSpecNum++;
                    // 拼装规格名称
                    $specSelectHtml[$key] = '<div class="prset-box" id="spec_'.$key.'">';
                    $specSelectHtml[$key] .= '<div id="div_'.$key.'">';
                    $specSelectHtml[$key] .= '<div class="prset-li"><span class="preset-bt-name"><span class="spec_name_span_'.$key.'">'.$value[0]['spec_name'].'</span><em data-name="'.$value[0]['spec_name'].'" data-mark_id="'.$key.'" onclick="clearProductSpecDataHandleName(this);"><i class="fa fa-times-circle" title="关闭" style="margin-left: 5px;"></i></em></span>';

                    // 拼装已选规格值
                    $specSelectHtml[$key] .= '<span id="SelectEd_'.$key.'">';
                    for ($i=0; $i<count($value); $i++) {
                        if (!empty($value[$i]['spec_is_select'])) {
                            $merchantSpecArrayEdit[$key][$i] = $value[$i]['spec_value_id'];
                            $specSelectHtml[$key] .= '<span class="preset-bt2" id="preset-bt2_'.$value[$i]['spec_id'].'"><span class="spec_value_span_'.$value[$i]['spec_value_id'].'">'.$value[$i]['spec_value'].'</span><em data-value="'.$value[$i]['spec_value'].'" data-mark_id="'.$value[$i]['spec_mark_id'].'" data-value_id="'.$value[$i]['spec_value_id'].'" onclick="clearProductSpecDataHandleValue(this);"><i class="fa fa-times-circle" title="关闭"></i></em> &nbsp; </span>';
                        }
                    }
                    $specSelectHtml[$key] .= '</span>';

                    // 拼装可选规格值
                    $specSelectHtml[$key] .= '<select class="preset-select w150" id="specValueOption_'.$key.'" onchange="addProductSpecDataHandleValue(this, '.$key.')">';
                    $specSelectHtml[$key] .= "<option value='0'>选择规格值</option>";
                    for ($i=0; $i<count($value); $i++) {
                        if (empty($value[$i]['spec_is_select'])) {
                            $specSelectHtml[$key]  .= "<option value='{$value[$i]['spec_value_id']}'>{$value[$i]['spec_value']}</option>";
                        }
                    }
                    $specSelectHtml[$key] .= '</select>';

                    // 拼装规格名称
                    $specSelectHtml[$key] .= '</div></div></div>';
                }
                // 获取已规格的价格信息HTML
                $productEditAssembly = $this->getProductSpecEditAssembly($merchantSpecArrayEdit, $aid);
                // session($merchant_id . '_MerchantSpecArrayEdit', $merchantSpecArrayEdit);
            }

            // 查询预设的规格数据
            $useSpecMarkID = !empty($merchantSpecArrayEdit) ? array_keys($merchantSpecArrayEdit) : [];
            $specPreset = $this->multiMerchantModel->getProductSpecPreset($merchant_id, $useSpecMarkID, 'NOT IN');

            // 读取规格预设库最大规格标记ID
            $maxSpecMarkID = $this->multiMerchantModel->getMaxSpecMarkID('product_spec_data_handle');

            // 已选使用的规格名称标记ID
            $useSpecMarkID = !empty($useSpecMarkID) ? implode(',', $useSpecMarkID) : '';
        }

        // 可发布商品的栏目
        $arctypeHtml = allow_release_arctype($productDetails['typeid'], [2], true);
        $arctypeHtml = str_ireplace('data-current_channel=', 'data-channel=', $arctypeHtml);
        $arctypeHtml = "<select name='typeid' id='typeid'><option value='0'>请选择栏目…</option>{$arctypeHtml}</select>";

        // 商品自定义参数
        $productCustomParam = Db::name('product_custom_param')->where($where)->order('sort_order asc, param_id asc')->select();

        // 组合返回信息数据
        return [
            'useSpecNum' => $useSpecNum,
            'specPreset' => $specPreset,
            'arctypeHtml' => $arctypeHtml,
            'maxSpecMarkID' => $maxSpecMarkID,
            'useSpecMarkID' => $useSpecMarkID,
            'productDetails' => $productDetails,
            'specSelectHtml' => $specSelectHtml,
            'productSpecData' => $productSpecData,
            'productCustomParam' => $productCustomParam,
            'productEditAssembly' => $productEditAssembly,
        ];
    }

    // 获取商品规格标记ID数组
    public function getUseSpecMarkID($post = [])
    {
        // 当选的规格名称标记ID
        $result = !empty($post['specMarkID']) ? $post['specMarkID'] : 0;
        if (empty($result)) return false;

        // 组合已选规格名字标记ID，若超过三个则返回 false
        if (!empty($post['useSpecMarkID'])) {
            $useSpecMarkID = $post['useSpecMarkID'] . ',' . $result;
            if (3 < count(explode(',', $useSpecMarkID))) {
                return false;
            } else {
                $result = $useSpecMarkID;
            }
        }

        // 返回结束
        return $result;
    }

    // 添加自定义规格到商品规格库
    public function addProductSpecDataHandleSaveUse($merchant_id = 0, $post = [])
    {
        // 最大规格名称标记ID值
        $maxSpecMarkID = $this->multiMerchantModel->getMaxSpecMarkID('product_spec_data_handle');
        // 规格值标记ID
        $maxSpecValueID = intval(intval($maxSpecMarkID) . rand(10, 80));
        // 添加的数据
        $insert = [];
        // 添加的规格名称处理
        if (empty($post['set_spec_name'])) $this->error('请填写规格名称...');
        // 添加的规格值处理
        $setPresetValue = $post['set_spec_value'];
        foreach ($setPresetValue as $key => $value) {
            if (!empty($value)) {
                $insert[] = [
                    'spec_id' => $maxSpecMarkID . $key . rand(0, 9),
                    'aid' => $post['aid'],
                    'spec_mark_id' => $maxSpecMarkID,
                    'spec_name' => $post['set_spec_name'],
                    'spec_value_id' => $maxSpecValueID,
                    'spec_value' => $value,
                    'spec_is_select' => 1,
                    'add_time' => getTime(),
                    'update_time' => getTime(),
                ];
                $maxSpecValueID++;
            }
        }
        if (empty($insert)) $this->error('请填写规格值...');
        // 执行添加
        $resultID = Db::name('product_spec_data_handle')->insertAll($insert);
        // 添加后续操作
        if (!empty($resultID)) {
            // 如果已添加过则执行
            if (!empty($post['is_add_spec']) && !empty($post['spec_mark_id'])) {
                // 删除指定规格
                $this->multiMerchantModel->clearProductSpecDataHandle($post['aid'], $post['spec_mark_id']);
            }
            // 仅ID信息，二维数组形式
            $merchantSpecArrayEdit = $this->multiMerchantModel->getProductSpecDataHandle($post['aid']);
            // 转换成字符串
            $useSpecMarkID = implode(',', array_keys($merchantSpecArrayEdit));
            // 返回结束
            return [
                'specMarkID' => $maxSpecMarkID,
                'useSpecMarkID' => $useSpecMarkID,
                'specArray' => $merchantSpecArrayEdit
            ];
        }
    }

    // 清除指定的规格信息(商品编辑)
    public function productSpecDataHandleClear($merchant_id = 0, $post = [])
    {
        // 获取已经选择的规格信息
        $merchantSpecArrayEdit = [];//session($merchant_id . '_MerchantSpecArrayEdit');
        // 当选规格名称ID
        $specMarkID = !empty($post['specMarkID']) ? $post['specMarkID'] : 0;
        // 清除整条规格信息
        if ('name' === strval($post['clear'])) {
            if (!empty($specMarkID) && !empty($post['useSpecMarkID'])) {
                // 清除指定规格数据
                // unset($merchantSpecArrayEdit[$specMarkID]);
                // 更新后的 Session 存入
                // session($merchant_id . '_MerchantSpecArrayEdit', $merchantSpecArrayEdit);

                // 清除指定规格数据
                $isClear = $this->multiMerchantModel->clearProductSpecDataHandle($post['aid'], $specMarkID);
                if (!empty($isClear)) {
                    // 获取全部可选的规格名称
                    $useSpecMarkID = explode(',', $post['useSpecMarkID']);
                    foreach ($useSpecMarkID as $key => $value) {
                        if (intval($value) === intval($specMarkID)) unset($useSpecMarkID[$key]);
                    }
                    $useSpecMarkID = implode(',', $useSpecMarkID);
                    // 剔除已选择的规格名称查询未选择的规格名称组装成下拉返回
                    $nameOption = $this->getPresetNameOption($merchant_id, $useSpecMarkID);

                    if (!empty($nameOption)) {
                        $merchantSpecArrayEdit = $this->multiMerchantModel->getProductSpecDataHandle($post['aid'], $useSpecMarkID);
                    }
                    // 追加规格数据并返回
                    $nameOption['SpecArray'] = $merchantSpecArrayEdit;
                    $nameOption['nameOption'] = $nameOption['option'];
                    return $nameOption;
                }
            }
            $this->error('操作异常，请刷新重试...');
        }
        // 清除单个规格信息
        else if ('value' === strval($post['clear'])) {
            // 规格值ID
            $valueID = !empty($post['valueID']) ? $post['valueID'] : 0;
            if (!empty($specMarkID) && !empty($valueID)) {
                // // 删除指定的规格值ID
                // foreach ($merchantSpecArrayEdit[$specMarkID] as $key => $value) {
                //     if (intval($value) === intval($valueID)) {
                //         unset($merchantSpecArrayEdit[$specMarkID][$key]);
                //     }
                // }
                // // 若规格组下没有规格值则删除规格组
                // if (empty($merchantSpecArrayEdit[$specMarkID])) unset($merchantSpecArrayEdit[$specMarkID]);
                // // 更新后的 Session 存入
                // session($merchant_id . '_MerchantSpecArrayEdit', $merchantSpecArrayEdit);

                // 清除指定规格数据
                $isClear = $this->multiMerchantModel->clearProductSpecDataHandle($post['aid'], $specMarkID, $valueID);
                if (!empty($isClear)) {
                    $merchantSpecArrayEdit = $this->multiMerchantModel->getProductSpecDataHandle($post['aid']);
                }
                // 剔除已选择的规格值查询未选择的规格值组装成下拉返回
                $notInPresetID = !empty($merchantSpecArrayEdit[$specMarkID]) ? $merchantSpecArrayEdit[$specMarkID] : [];
                $valueOption = $this->getProductSpecDataValueOption($post['aid'], $specMarkID, $notInPresetID);

                // 追加规格数据并返回
                return [
                    'SpecArray' => $merchantSpecArrayEdit,
                    'valueOption' => $valueOption['option']
                ];
            }
            $this->error('操作异常，请刷新重试...');
        }
    }

    // 拼装预设规格名称的规格值下拉选项
    public function getProductSpecDataValueOption($aid = 0, $specMarkID = 0, $notInPresetID = [])
    {
        // 查询当选规格的全部规格值
        $where = [
            'aid' => $aid,
            'spec_mark_id' => ['IN', $specMarkID],
        ];
        if (!empty($notInPresetID)) $where['spec_value_id'] = ['NOT IN', $notInPresetID];
        $specData = Db::name('product_spec_data_handle')->where($where)->order('spec_value_id asc')->select();
        $Name = !empty($specData[0]['spec_name']) ? $specData[0]['spec_name'] : '';

        // 拼装下拉选项
        $Option = '<option value="0">选择规格值</option>';
        if (!empty($specData)) {
            foreach ($specData as $value) {
                $Option .= "<option value='{$value['spec_value_id']}'>{$value['spec_value']}</option>";
            }
        }

        // 返回结束
        return [
            'name' => $Name,
            'option' => $Option,
        ];
    }

    // 追加商品规格名称(编辑页)
    public function productSpecDataHandleName($merchant_id = 0, $post = [])
    {
        // Post 数据
        $aid = !empty($post['aid']) ? $post['aid'] : 0;
        $specMarkID = !empty($post['specMarkID']) ? $post['specMarkID'] : 0;
        $useSpecMarkID = !empty($post['useSpecMarkID']) ? $post['useSpecMarkID'] : 0;
        if (empty($aid) || empty($specMarkID) || empty($useSpecMarkID)) $this->error('操作异常，请刷新重试...');

        // 查询商品规格库指定规格组下的所有规格值信息
        $specData = $this->multiMerchantModel->getProductSpecDataValue($aid, $specMarkID);
        if (empty($specData)) {
            $specData = [];
            // 查询预设规格库指定规格信息
            $specPreset = $this->multiMerchantModel->getProductSpecPresetValue($merchant_id, $specMarkID, 'IN');
            foreach ($specPreset as $key => $value) {
                $specData[] = [
                    'spec_id' => $value['preset_mark_id'] . $key . rand(0, 9),
                    'aid' => $aid,
                    'spec_mark_id' => $value['preset_mark_id'],
                    'spec_name' => $value['preset_name'],
                    'spec_value_id' => $value['preset_id'],
                    'spec_value' => $value['preset_value'],
                    'spec_is_select' => 0,
                    'add_time' => getTime(),
                    'update_time' => getTime()
                ];
            }
        }

        $merchantSpecArrayEdit = [];
        // 清除指定规格数据
        $isAdd = $this->multiMerchantModel->addProductSpecDataHandle($specData);
        if (!empty($isAdd)) {
            // 查询指定规格ID数据
            $merchantSpecArrayEdit = $this->multiMerchantModel->getProductSpecDataHandle($aid, '', 0);
        }

        // 剔除已选择的规格名称查询未选择的规格名称组装成下拉返回
        $useSpecMarkID = array_keys($merchantSpecArrayEdit);
        $nameOption = $this->getPresetNameOption($merchant_id, $useSpecMarkID);

        // 追加规格数据并返回
        $nameOption['specArray'] = $merchantSpecArrayEdit;
        $nameOption['nameOption'] = $nameOption['option'];
        return $nameOption;
    }

    // 追加商品规格名称和规格值(编辑页)
    public function productSpecDataHandleValue($merchant_id = 0, $post = [])
    {
        // Post 数据
        $aid = !empty($post['aid']) ? $post['aid'] : 0;
        $valueID = !empty($post['valueID']) ? $post['valueID'] : 0;
        $specMarkID = !empty($post['specMarkID']) ? $post['specMarkID'] : 0;
        if (empty($aid) || empty($valueID) || empty($specMarkID)) $this->error('操作异常，请刷新重试...');

        $merchantSpecArrayEdit = [];
        // 清除指定规格数据
        $isAdd = $this->multiMerchantModel->addProductSpecDataHandle([], $post);
        if (!empty($isAdd)) {
            $merchantSpecArrayEdit = $this->multiMerchantModel->getProductSpecDataHandle($aid);
        }
        // 剔除已选择的规格值查询未选择的规格值组装成下拉返回
        $notInPresetID = !empty($merchantSpecArrayEdit[$specMarkID]) ? $merchantSpecArrayEdit[$specMarkID] : [];
        $valueOption = $this->getProductSpecDataValueOption($aid, $specMarkID, $notInPresetID);

        // 追加规格数据并返回
        return [
            'SpecArray' => $merchantSpecArrayEdit,
            'valueOption' => $valueOption['option']
        ];

        // // Post 数据
        // $valueID = !empty($post['valueID']) ? $post['valueID'] : 0;
        // $specMarkID = !empty($post['specMarkID']) ? $post['specMarkID'] : 0;
        // // Session 数据
        // $merchantSpecArrayEdit = session($merchant_id . '_MerchantSpecArrayEdit');
        // // 整合Session和Post中的规格数据
        // if (!empty($valueID) && !empty($specMarkID)) {
        //     $mergeSpecArrayNew = [ $specMarkID => [ $valueID ] ];
        //     foreach ($mergeSpecArrayNew as $key => $value) {
        //         if (isset($merchantSpecArrayEdit[$key])) {
        //             if (in_array($value[0], $merchantSpecArrayEdit[$key])) {
        //                 return ['error' => '已有相同规格值，无需重复添加'];
        //             } else {
        //                 $value[0] = intval($value[0]);
        //                 // session存在数据，但选中参数在数据中还没有，合并数据
        //                 $merchantSpecArrayEdit[$key] = array_merge($merchantSpecArrayEdit[$key], $value);
        //             }
        //         } else {
        //             if (!empty($merchantSpecArrayEdit)) {
        //                 $merchantSpecArrayEdit = $merchantSpecArrayEdit + $mergeSpecArrayNew;
        //             } else {
        //                 $merchantSpecArrayEdit = $mergeSpecArrayNew;
        //             }
        //         }
        //     }
        // }
        // // Session 存入
        // session($merchant_id . '_MerchantSpecArrayEdit', $merchantSpecArrayEdit);
        // 返回结束
        // return $merchantSpecArrayEdit;
    }

    // 剔除已选择的规格值查询未选择的规格值组装成下拉返回
    // public function getNotInDataValueOption($merchant_id = 0, $post = [])
    // {
    //     // Session 数据
    //     $merchantSpecArrayEdit = session($merchant_id . '_MerchantSpecArrayEdit');

    //     // 获取指定规格名称下的规格值数组
    //     $specIDArray = !empty($merchantSpecArrayEdit[$post['specMarkID']]) ? $merchantSpecArrayEdit[$post['specMarkID']] : [];

    //     // 剔除已选择的规格值查询未选择的规格值数据
    //     $specResult = $this->getProductSpecDataValueOption($post['aid'], $post['specMarkID'], $specIDArray);

    //     // 返回结束
    //     return [
    //         'value' => $specResult['name'],
    //         'option' => $specResult['option'],
    //     ];
    // }

    // 拼装商品规格编辑html
    public function getProductSpecEditAssembly($post = [], $aid = 0)
    {
        if (empty($post)) return '<div></div>';
        // 参数处理
        foreach ($post as $k => $v) {
            $spec_arr_sort[$k] = count($v);
        }
        asort($spec_arr_sort);
        foreach ($spec_arr_sort as $key =>$val) {
            $spec_arr2[$key] = $post[$key];
        }
        // 排序
        $order = 'spec_value_id asc, spec_id asc, spec_mark_id asc';
        // 获取KEY值
        $clo_name  = array_keys($spec_arr2);
        // 数据组合
        $spec_arr2 = $this->dataCombination($spec_arr2);
        // 查询规格名称
        $spec = Db::name('product_spec_data_handle')->where('aid', $aid)->order($order)->group('spec_mark_id')->getField('spec_mark_id, spec_name');
        // 查询规格值
        $specItem = Db::name('product_spec_data_handle')->where('aid', $aid)->order($order)->getField('spec_value_id, spec_value, spec_mark_id');
        // 查询规格价格
        $specPrice = Db::name('product_spec_value')->where('aid', $aid)->order('spec_price asc')->getField('spec_value_id, spec_price, spec_stock, spec_sales_num');
        // 组合HTML
        $ReturnHtml  = "<table class='table table-bordered' id='spec_input_tab' border='1' cellpadding='10' cellspacing='10' style='text-align: center; vertical-align: middle;'><thead><tr>";
        // 显示第一行的数据
        foreach ($clo_name as $k => $v) {
            $ReturnHtml .= "<td ><b><input type='hidden' class='spec_name_input_{$v}' name='spec_mark_id[$v][spec_name]' value='{$spec[$v]}'><span class='spec_name_span_{$v}'>{$spec[$v]}</span></b></td>";
        }
        $ReturnHtml .= "<td ><b>价格 <a href=\"javascript:void(0);\" onclick=\"bulkSetPrice(this);\" style=\"color: #0ba6f3;\">批量设置 </a></b></td>";
        $ReturnHtml .= "<td ><b>库存 <a href=\"javascript:void(0);\" onclick=\"bulkSetStock(this);\" style=\"color: #0ba6f3;\">批量设置 </a></b></td>";
        $ReturnHtml .= "<td ><b>销量</b></td>";
        $ReturnHtml .= "</tr></thead><tbody>";

       // 显示第二行开始
       foreach ($spec_arr2 as $k => $v) {
            $ReturnHtml .= "<tr >";
            $spec_key_name = array();
            foreach($v as $k2 => $v2) {
                $ReturnHtml .= "<td style='text-align: center; vertical-align: middle;'><input type='hidden' class='spec_value_input_{$v2}' name='spec_value_id[$v2][spec_value]' value='{$specItem[$v2]['spec_value']}'><span class='spec_value_span_{$v2}'>{$specItem[$v2]['spec_value']}</span></td>";
                $spec_key_name[$v2] = $spec[$specItem[$v2]['spec_mark_id']].':'.$specItem[$v2]['spec_value'];
            }   
            ksort($spec_key_name);
            $spec_key = implode('_', array_keys($spec_key_name));

            $specPrice[$spec_key]['spec_price'] = !empty($specPrice[$spec_key]['spec_price']) ? $specPrice[$spec_key]['spec_price'] : 0;
            $ReturnHtml .="<td ><input class='users_price' name='spec_price[$spec_key][users_price]' value='{$specPrice[$spec_key]['spec_price']}' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\");upPrice(this);'/></td>";

            $specPrice[$spec_key]['spec_stock'] = !empty($specPrice[$spec_key]['spec_stock']) ? $specPrice[$spec_key]['spec_stock'] : 0;
            $ReturnHtml .="<td ><input class='stock_count' name='spec_stock[$spec_key][stock_count]' value='{$specPrice[$spec_key]['spec_stock']}' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\");upStock(this);' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")' data-old_stock='{$specPrice[$spec_key]['spec_stock']}'/></td>";

            $specPrice[$spec_key]['spec_sales_num'] = !empty($specPrice[$spec_key]['spec_sales_num']) ? $specPrice[$spec_key]['spec_sales_num'] : 0;
            $ReturnHtml .="<td ><input type='text' name='spec_sales[$spec_key][spec_sales_num]' value='{$specPrice[$spec_key]['spec_sales_num']}' onkeyup='this.value=this.value.replace(/[^\d.]/g,\"\")' onpaste='this.value=this.value.replace(/[^\d.]/g,\"\")'></td>";

            $ReturnHtml .="</tr>";
        }
        $ReturnHtml .= "</tbody>";
        $ReturnHtml .= "</table>";

        return $ReturnHtml;
    }

    // 数据组合
    private function dataCombination()
    {
        $result = [];
        $data = func_get_args();
        $data = current($data);
        $arr1 = array_shift($data);
        foreach ($arr1 as $key => $item) {
            $result[] = array($item);
        }

        foreach ($data as $key => $item) {                                
            $result = $this->dataCombinationArray($result, $item);
        }

        // 返回结束
        return $result;
    }

    // 数组二次组合
    private function dataCombinationArray($arr1, $arr2)
    {
        $result = array();
        foreach ($arr1 as $item1) {
            foreach ($arr2 as $item2) {
                $temp = $item1;
                $temp[] = $item2;
                $result[] = $temp;
            }
        }

        // 返回结束
        return $result;
    }


    // -------- 订单部分
    // 关闭商家订单
    public function closeMerchantOrder($merchant_id = 0, $order_id = 0)
    {
        // 基础判断
        if (empty($merchant_id) || empty($order_id)) $this->error('请正确访问..');

        // 执行关闭商家订单
        $resultID = $this->multiMerchantModel->closeMerchantOrder($merchant_id, $order_id);
        // 关闭订单后续操作
        if (!empty($resultID)) {
            // 恢复商品数量
            $productSpecValueModel = new \app\user\model\ProductSpecValue;
            $productSpecValueModel->SaveProducSpecValueStock($order_id);

            // 添加订单操作记录
            AddOrderAction($order_id, $this->users['users_id'], 0, -1, 0, 0, '订单关闭', '商家操作关闭订单');

            $this->success('订单已关闭..');
        } else {
            $this->error('操作异常，请刷新重试..');
        }
    }

    // 确认商家订单收货
    public function confirmMerchantOrder($merchant_id = 0, $order_id = 0)
    {
        // 基础判断
        if (empty($merchant_id) || empty($order_id)) $this->error('请正确访问..');

        // 执行确认商家订单收货
        $resultID = $this->multiMerchantModel->confirmMerchantOrder($merchant_id, $order_id);
        // 订单收货后续操作
        if (!empty($resultID)) {
            // 添加订单操作记录
            AddOrderAction($order_id, $this->users['users_id'], 0, -1, 0, 0, '确认收货', '商家确认订单已收货');

            $this->success('订单已收货..');
        } else {
            $this->error('操作异常，请刷新重试..');
        }
    }

    // 商家订单发货
    public function sendMerchantOrder($merchant_id = 0, $post = [])
    {
        // 需要物流时必须选择快递
        if (isset($post['prom_type']) && 0 === intval($post['prom_type'])) {
            if (empty($post['express_id']) || empty($post['express_name']) || empty($post['express_code'])) {
                $this->error('请选择快递公司..');
            } else if (empty($post['express_order'])) {
                $this->error('请填写配送单号..');
            }
        }

        // 执行商家订单发货
        $resultData = $this->multiMerchantModel->sendMerchantOrder($merchant_id, $post);
        // 订单发货后续
        if (!empty($resultData)) {
            // 添加订单操作记录
            AddOrderAction($post['order_id'], $this->users['users_id'], 0, 2, 1, 1, $resultData['action_desc'], $resultData['action_note']);
            
            // 查询会员信息
            $field = 'username, nickname, email, mobile';
            $users = Db::name('users')->field($field)->where('users_id', intval($post['users_id']))->find();
            // 邮箱发送
            $smtpConfig = tpCache('smtp');
            $result['email'] = GetEamilSendData($smtpConfig, $users, $post, 2);
            // 手机发送
            $smsConfig = tpCache('sms');
            $result['mobile'] = GetMobileSendData($smsConfig, $users, $post, 2);
            // 发送站内信给会员
            $nickname = !empty($users['nickname']) ? $users['nickname'] : $users['username'];
            SendNotifyMessage($resultData, 6, 0, $post['users_id'], $nickname);

            $this->success('发货成功..', null, $result);
        } else {
            $this->error('操作异常，请刷新重试..');
        }
    }

    // 售后订单处理
    public function dealWithMerchantService($merchant_id = 0, $users_id = 0, $post = [])
    {
        // 基础判断
        if (empty($post)) $this->error('请正确操作..');
        if (empty($post['status'])) $this->error('请选择审核意见..');
        $post['manual_refund'] = !empty($post['manual_refund']) ? $post['manual_refund'] : 0;

        // 更新条件和更新数据
        $where = [
            'merchant_id' => $merchant_id,
            'users_id'   => $post['users_id'],
            'service_id' => $post['service_id']
        ];
        $update = [
            'update_time' => getTime(),
            'status' => $post['status']
        ];
        if (!empty($post['admin_note'])) $update['admin_note'] = $post['admin_note'];
        if (!empty($post['refund_price'])) $update['refund_balance'] = $post['refund_price'];
        if (!empty($post['delivery'])) $update['admin_delivery'] = serialize($post['delivery']);
        // 执行更新服务单状态
        $updateID = Db::name('shop_order_service')->where($where)->update($update);
        if (!empty($updateID)) {
            // 退款回会员
            if (7 === intval($post['status'])) {
                if (!isset($post['is_refund']) || 1 == $post['is_refund']) {
                    // 查询会员信息
                    $field = 'users_id, username, nickname, email, mobile, users_money';
                    $Users = Db::name('users')->field($field)->where('users_id', $post['users_id'])->find();

                    // 退款操作
                    $update = [
                        'users_money' => Db::raw('users_money+'.($post['refund_price'])),
                    ];
                    $updateID = Db::name('users')->where('users_id', $post['users_id'])->update($update);
                    if (!empty($updateID)) {
                        if (empty($post['order_code'])) {
                            $post['order_code'] = Db::name('shop_order')->where('order_id', $post['order_id'])->getField('order_code');
                        }
                        // 添加余额记录
                        UsersMoneyRecording($post['order_code'], $Users, $post['refund_price'], '商品退换货');
                    }
                }
            }

            // 售后服务手动完成服务单并自行退款
            if (in_array($post['status'], [6, 7]) && isset($post['is_refund']) && 0 === intval($post['is_refund']) && 1 === intval($post['manual_refund'])) {
                $where = [
                    'merchant_id' => $merchant_id,
                    'users_id' => $post['users_id'],
                    'service_id' => $post['service_id']
                ];
                $update = [
                    'manual_refund' => 1,
                    'refund_note' => trim($post['refund_note']),
                    'update_time' => getTime(),
                ];
                Db::name('shop_order_service')->where($where)->update($update);
            }

            // 添加退换货服务记录
            $shopCommonLogic = new \app\common\logic\ShopCommonLogic;
            $post['users_id'] = $users_id;
            $shopCommonLogic->AddOrderServiceLog($post, 1);

            $this->success('操作成功..');
        } else {
            $this->error('操作失败，刷新重试..');
        }
    }

    // 撤销提现订单
    public function revokeMerchantAssetWithdraw($merchant_id = 0, $post = [])
    {
        // 更新条件
        $where = [
            'withdraw_id' => intval($post['withdraw_id']),
        ];
        // 更新数据
        $update = [
            'status' => intval($post['status']),
            'update_time' => getTime()
        ];
        // 执行更新
        $updateID = Db::name('weapp_multi_merchant_withdraw')->where($where)->update($update);
        if (!empty($update)) {
            // 查询提现金额
            $withdrawMoney = Db::name('weapp_multi_merchant_withdraw')->where($where)->getField('withdraw_money');
            // 更新数据
            $update = [
                'available_balance' => Db::raw('available_balance' . '+' . $withdrawMoney),
                'freeze_balance' => Db::raw('freeze_balance-' . $withdrawMoney),
                'update_time' => getTime()
            ];
            // 更新条件
            $where = [
                'merchant_id' => intval($merchant_id),
            ];
            // 执行更新
            $updateID = Db::name('weapp_multi_merchant')->where($where)->update($update);
            if (!empty($updateID)) {
                $this->success('撤销成功..');
            } else {
                // 更新条件
                $where = [
                    'withdraw_id' => intval($post['withdraw_id']),
                ];
                // 更新数据
                $update = [
                    'status' => 1,
                    'update_time' => getTime()
                ];
                // 执行更新
                Db::name('weapp_multi_merchant_withdraw')->where($where)->update($update);

                $this->error('撤销失败，刷新重试..');
            }
        } else {
            $this->error('撤销失败，刷新重试..');
        }
    }
    
}